#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5+5;
const LL inf = 1e10+7;
struct BIT
{
	int N;
	LL sum[maxn];
	void _init(int n){
		N = n;
		fill(sum,sum+n+2,0);
	}
	int lowbit(int x){return x&(-x);}
	void add(int p,LL x){
		while(p<=N){
			sum[p] += x;
			p += lowbit(p);
		}
	}
	LL query(int p){
		LL ret = 0;
		while(p){
			ret += sum[p];
			p -= lowbit(p);
		}
		return ret;
	}
}sg;
int L[maxn],R[maxn],v[maxn],fa[maxn][20],dep[maxn],cnt;
vector<int> G[maxn];
void dfs(int u,int f){
	L[u] = ++cnt;
	dep[u] = dep[f] + 1;
	fa[u][0] = f;
	for(int i=1;i<20;++i)fa[u][i] = fa[fa[u][i-1]][i-1];
	for(auto &v:G[u]){
		if(v == f)continue;
		dfs(v,u);
	}
	R[u] = cnt;
}
int getlca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	while(dep[x]>dep[y])x = fa[x][__lg(dep[x]-dep[y])];
	if(x == y)return x;
	for(int k=__lg(dep[x]);k>=0;--k){
		if(fa[x][k] == fa[y][k])continue;
		x = fa[x][k],y = fa[y][k];
	}
	return fa[x][0];
}
int T,N,M;
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&N,&M);
		cnt = 0;
		sg._init(N);
		for(int i=1;i<=N;++i)G[i].clear();
		for(int i=1;i<N;++i){
			int u,v;
			scanf("%d%d",&u,&v);
			G[u].push_back(v);G[v].push_back(u);
		}
		dfs(1,0);
		for(int i=1;i<=N;++i){
			scanf("%d",&v[i]);
			sg.add(L[i],v[i]),sg.add(R[i]+1,-v[i]);
		}	
		while(M--){
			int opt,x,y;
			scanf("%d%d%d",&opt,&x,&y);
			if(opt == 1){
				int lca = getlca(x,y);
				LL ret = sg.query(L[y]) + sg.query(L[x]) - sg.query(L[lca]) - sg.query(L[fa[lca][0]]);
				if(ret < inf/2)printf("%lld\n",ret);
				else printf("%lld\n",(ret+inf/2)/inf);
			}
			else{
				LL d = y;
				v[x] += y;
				if(v[x]<0 && v[x]-y>=0)d += inf;
				if(v[x]>=0 && v[x]-y<0)d -= inf;
				sg.add(L[x],d),sg.add(R[x]+1,-d);
			}
		}
	}
	return 0;
}